#include "myclass.h"
#include <string>
using namespace std;
int  func_reload(int a)
{
    return a;
}

int  func_reload(int a,int b)
{
    return a+b;
}
////////////////////
//类
class Circle{
    //权限
public:
    //属性  变量
    int mr;
    double PI = 3.14;
    //行为  函数
    double calulate_cir()
    {
        return 2*PI*mr;
    }
};

void func_class(void)
{
    Circle cl;
    cl.mr = 10;
    std::cout << "Circle:"<<cl.calulate_cir() << std::endl;
}

class student
{
//权限
public:
//属性
    string stuName;
    int stuId;
//行为
    void ShowStu(void)
    {
        std::cout<< "姓名: " << stuName << " 学号: " << stuId << std::endl;
    }
    void SetName(string Name)
    {
        stuName = Name;
    }
    void SetId(int Id)
    {
        stuId = Id;
    }

};

void func_class_stu(void)
{
    student s1,s2;
    s1.SetName("小明");
    s1.SetId(1);
    s1.ShowStu();
    s2.SetName("大华");
    s2.SetId(2);
    s2.ShowStu();
}

class Person
{
public:
    //公共权限
    string m_Name;

protected:
    //保护权限
    string m_Car;

private:
    //私有权限
    int m_password;

public:
    void func(void)
    {
        //m_Name = "张三";
        m_Car = "拖拉机";
        m_password = 123456;
    }

};

void func_class_person(void)
{
    Person per1;
    per1.m_Name = "李四";
    per1.func();
}

class C1
{
public:
    int m_num;
};

struct C2
{
    int m_num;
};

void func_class_struct(void)
{
/**
 *   struct和class的区别:
 *   struct默认权限为 共有 public
 *   class默认权限为 私有  private
 */
    C1 a1;
    a1.m_num = 100;

    C2 a2;
    a2.m_num  =80;

    std::cout << "A1: " << a1.m_num << std::endl;
    std::cout << "A2: " << a2.m_num << std::endl;
}

class people{
public:
    string GetName(void)
    {
        return m_name;
    }
    void SetName(string name)
    {
        m_name = name;
    }

    int GetAge(void)
    {
        return m_age;
    }
    void SetAge(int age)
    {
        m_age = age;
    }

    string GetIdol(void)
    {
        return m_idol;
    }
    void SetIdol(string idol)
    {
        m_idol = idol;
    }

private:
    string m_name = "小明";
    int m_age = 18;
    string m_idol = "张伟";
};

void func_class_people(void)
{

    //成员属性设置为私有
    //1.可以自己控制读写权限
    //2.对于写可以检测数据有效性
    people p1;
    std::cout << "Name: "<< p1.GetName() << std::endl;
    std::cout << "Age: "<< p1.GetAge() << std::endl;
    std::cout << "Idol: "<< p1.GetIdol() << std::endl;
    p1.SetName("陶");
    p1.SetAge(70);
    p1.SetIdol("成龙");
    std::cout << "Name: "<< p1.GetName() << std::endl;
    std::cout << "Age: "<< p1.GetAge() << std::endl;
    std::cout << "Idol: "<< p1.GetIdol() << std::endl;
}

//构造函数与析构函数
class function{

public:
    //构造函数
    //1.构造函数，没有返回值也不写void;
    //2.函数名称与类名相同;
    //3.构造函数可以有参数，因此可以发生重载;
    //4.程序在调用对象时候会自动调用构造，无须手动调用
    //主要作用在于创建对象时为对象的成员属性赋值，构造函数由编译器自动调用，无须手动调用
    function()
    {
        std::cout << "这是构造函数的执行,编译一开始会执行一次" << std::endl;
    }
    //析构函数
    //1.析构函数,没有返回值也不写void
    //2.函数名称与类名相同，在名称前加上符号~
    //3.析构函数不可以有参数，因此不可以发生重载
    //4.程序在对象销毁前会自动调用析构，无须手动调用，而且只会调用一次
    //主要作用在于对象销毁前系统自动调用，执行一些清理工作
    ~function()
    {
        std::cout << "这是析构函数的执行,程序结束会执行一次" << std::endl;
    }

};

void func_class_function(void)
{
    function P;
}
